feat(plugin): Auto-wrap SQLiteDriver with SentrySQLiteDriver for Room users#1285
Open
0xadam-brown wants to merge 1 commit into
Open
feat(plugin): Auto-wrap SQLiteDriver with SentrySQLiteDriver for Room users#12850xadam-brown wants to merge 1 commit into
0xadam-brown wants to merge 1 commit into
Conversation
Contributor
|
0xadam-brown
commented
Jun 9, 2026
0xadam-brown
commented
Jun 9, 2026
| ### Features | ||
|
|
||
| - Auto-wrap SQLiteDriver with SentrySQLiteDriver for Room users ([#1281](https://github.com/getsentry/sentry-android-gradle-plugin/issues/1281)) | ||
| - Gated on `sentry-android-sqlite` >= 8.44.0 and the existing `tracingInstrumentation` `DATABASE` feature |
Member
Author
There was a problem hiding this comment.
TODO: Update version number once we ship the SentrySQLiteDriver in sentry-android.
0xadam-brown
commented
Jun 9, 2026
0xadam-brown
commented
Jun 9, 2026
0xadam-brown
commented
Jun 9, 2026
| internal val VERSION_LOGCAT = SemVer(6, 17, 0) | ||
| internal val VERSION_APP_START = SemVer(7, 1, 0) | ||
| internal val VERSION_SQLITE = SemVer(6, 21, 0) | ||
| internal val VERSION_SQLITE_DRIVER = SemVer(8, 44, 0) |
Member
Author
There was a problem hiding this comment.
TODO: Update version number once we ship the SentrySQLiteDriver in sentry-android.
f64ad3f to
1c821b7
Compare
0xadam-brown
commented
Jun 10, 2026
| } | ||
| } | ||
|
|
||
| @Ignore(SQLITE_DRIVER_IGNORE_REASON) |
Member
Author
There was a problem hiding this comment.
TODO: Remove @Ignore once we ship the SentrySQLiteDriver in sentry-android.
0xadam-brown
commented
Jun 10, 2026
| ) | ||
| } | ||
|
|
||
| @Ignore(SQLITE_DRIVER_IGNORE_REASON) |
Member
Author
There was a problem hiding this comment.
TODO: Remove @Ignore once we ship the SentrySQLiteDriver in sentry-android.
0xadam-brown
commented
Jun 10, 2026
| assertInstrumentableChain(build, "AndroidXSQLiteOpenHelper", "AndroidXRoomDao") | ||
| } | ||
|
|
||
| @Ignore(SQLITE_DRIVER_IGNORE_REASON) |
Member
Author
There was a problem hiding this comment.
TODO: Remove @Ignore once we ship the SentrySQLiteDriver in sentry-android.
0xadam-brown
commented
Jun 10, 2026
| ) | ||
| } | ||
|
|
||
| @Ignore(SQLITE_DRIVER_IGNORE_REASON) |
Member
Author
There was a problem hiding this comment.
TODO: Remove @Ignore once we ship the SentrySQLiteDriver in sentry-android.
… users (GRADLE-107)
Adds a new ASM bytecode method visitor that lets us auto-wrap all occurrences of SQLiteDriver with SentrySQLiteDriver whenever the driver is passed to Room.DatabaseBuilder.setDriver(...).
For instance:
val database = Room.databaseBuilder(context, MyDatabase::class.java, "dbName")
.setDriver(AndroidSQLiteDriver())
.build()
becomes:
val database = Room.databaseBuilder(context, MyDatabase::class.java, "dbName")
.setDriver(SentrySQLiteDriver.create(AndroidSQLiteDriver()))
.build()
The wrapping policy is naive in that every SQLiteDriver passed to setDriver() is wrapped. That's deliberate because SentrySQLiteDriver protects against double-wrapping internally, which lets us keep our visitor implementation simple.
Preconditions:
1. InstrumentationFeature.DATABASE is enabled
2. The owning app is using a version of sentry-android-sqlite that includes SentrySQLiteDriver
Coverage:
- Auto-wraps SQLiteDriver for all Room users (sole Room access point is via its Room.DatabaseBuilder.setDriver() method).
- SQLDelight users don't need driver auto-wrapping (they still use SupportSQLiteOpenHelper, which we already auto-wrap).
- The few developers who use SQLiteDriver directly will need to wrap it manually.
1c821b7 to
1548c9c
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📜 Description
Adds a new bytecode method visitor that lets us auto-wrap all occurrences of
SQLiteDriverwithSentrySQLiteDriverwhenever the driver is passed to asetDriver(SQLiteDriver)method.For instance:
becomes:
The wrapping policy is naive in that every SQLiteDriver passed to setDriver() is wrapped. That's deliberate because SentrySQLiteDriver protects against double-wrapping internally, which lets us keep our visitor implementation simple.
💡 Motivation and Context
Room 2.7 introduced
RoomDatabase.Builder.setDriver(SQLiteDriver)as the new way to configure an underlying SQLite implementation (link), with the intention of eventually replacingSupportSQLiteOpenHelper. (Room 3.0+ does just that.)The Sentry Android Gradle Plugin currently auto-instruments only the open helper path. Apps that adopt the driver-based API will lose automatic SQL performance instrumentation unless they manually wrap their driver with
SentrySQLiteDriver.create(...)at everysetDriver(...)call site.This PR provides auto-wrapping for the driver path too.
Addresses GRADLE-107 / #1281
Preconditions
Coverage
💚 How did you test it?
[1] Added unit tests
[2] Performed benchmark tests against the DuckDuckGo app
tl;dr: Impact on build times looks acceptable. Auto-wrapping SQLiteDriver adds no meaningful cost on cold full builds, but roughly 1.5s- 2.5s (10–15%) compile-time overhead on warm incremental builds, as the instrumentable scans every non-Sentry class/method per compile.
Benchmark results: Click to expand
SQLiteDriver auto-wrap A/B benchmark results
Setup
13019962686.10.0from localbenchmark/sqlite-driver-*branches6.21.0+ compile stub forSentrySQLiteDriverAndroidXSQLiteDriveralways in the instrumentable chainAndroidXSQLiteDrivercommented outScenarios: cold clean build (5 iterations) and warm incremental build after ABI change to
BookmarksDao.kt(7 iterations).Note: SDK 6.21.0 + stub was used because DuckDuckGo's Kotlin 1.7 can't build with Sentry 8.43. This measures plugin instrumentation compile cost, not runtime span overhead.
Clean build (
assembleInternalDebug+clean, cold daemon)No meaningful impact / within run-to-run noise.
Incremental build (warm daemon, DAO ABI tweak)
This is the scenario that matters for day-to-day development: the driver instrumentable visits every non-Sentry class / method on each compile, even when only a Room DAO changes.
Takeaways
AndroidXSQLiteDriveris enabled, driven by broad class/method visitor activation (same pattern as Logcat).📝 Checklist
🔮 Next steps
VERSION_SQLITE_DRIVERto match the sentry-android version that introducesSentrySQLiteDriver(PR here) + address other inline TODOs.